package com.manage.modules.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.manage.modules.bo.DataUsableQueryBo;
import com.manage.modules.domain.TBaseSurfMin;
import com.manage.modules.mapper.TBaseSurfMinMapper;
import com.manage.modules.service.IDataUsableService;
import com.manage.modules.utils.MathUtils;
import com.manage.modules.vo.DataUsableVo;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 数据业务可用性统计接口实现层
 *
 * @author xu
 * 2021/9/28 16:53
 */
@Service
public class DataUsableServiceImpl extends ServiceImpl<TBaseSurfMinMapper, TBaseSurfMin> implements IDataUsableService {


    @Override
    public List<DataUsableVo> listVo(DataUsableQueryBo bo) {
        LambdaQueryWrapper<TBaseSurfMin> lqw = Wrappers.lambdaQuery();
        lqw.eq(StrUtil.isNotBlank(bo.getStationIdC()), TBaseSurfMin::getStationIdC, bo.getStationIdC());
        // 缺报的不用记录
        lqw.ne(true,TBaseSurfMin::getStationIdC,"2");
        lqw.orderByDesc(TBaseSurfMin::getSurfId);

        return entity2Vo(this.list(lqw));
    }

    private List<DataUsableVo> entity2Vo(Collection<TBaseSurfMin> collection){
        List<DataUsableVo> voList = new ArrayList<>();
        for (TBaseSurfMin surfMin : collection) {
            DataUsableVo dataUsableVo = new DataUsableVo();
            // 几个一样的
            dataUsableVo.setSurfId(surfMin.getSurfId());
            dataUsableVo.setCreateTime(surfMin.getCreateTime());
            dataUsableVo.setUpdateTime(surfMin.getUpdateTime());
            dataUsableVo.setRequestNum(surfMin.getRequestNum());
            dataUsableVo.setStationIdC(surfMin.getStationIdC());
            dataUsableVo.setLat(surfMin.getLat());
            dataUsableVo.setLon(surfMin.getLon());

            // 计算的
            // 无观测任务
            Map<String,String> noTaskMap = getDataByQCode(surfMin,Arrays.asList("5","6","7"),1);
            // 除去无观测任务的总数
            int sum = 6 - Integer.parseInt(noTaskMap.get("num"));
            // 可用数据
            Map<String,String> usableMap = getDataByQCode(surfMin,Arrays.asList("0","3","4"),sum);
            // 错误数据
            Map<String,String> errorMap = getDataByQCode(surfMin, Collections.singletonList("2"),sum);
            // 可疑数据
            Map<String,String> suspiciousMap = getDataByQCode(surfMin, Collections.singletonList("1"),sum);
            // 缺测数据
            Map<String,String> missMap = getDataByQCode(surfMin, Collections.singletonList("8"),sum);
            // 未质控数据
            Map<String,String> controlMap = getDataByQCode(surfMin, Collections.singletonList("9"),sum);

            dataUsableVo.setNoTask( noTaskMap.get("str"));

            dataUsableVo.setUsableNum(usableMap.get("num"));
            dataUsableVo.setUsableStr(usableMap.get("str"));
            dataUsableVo.setUsableRate(usableMap.get("rate"));

            dataUsableVo.setErrorNum(errorMap.get("num"));
            dataUsableVo.setErrorStr(errorMap.get("str"));
            dataUsableVo.setErrorRate(errorMap.get("rate"));

            dataUsableVo.setSuspiciousNum(suspiciousMap.get("num"));
            dataUsableVo.setSuspiciousStr(suspiciousMap.get("str"));
            dataUsableVo.setSuspiciousRate(suspiciousMap.get("rate"));

            dataUsableVo.setMissNum(missMap.get("num"));
            dataUsableVo.setMissStr(missMap.get("str"));
            dataUsableVo.setMissRate(missMap.get("rate"));

            dataUsableVo.setControlNum(controlMap.get("num"));
            dataUsableVo.setControlStr(controlMap.get("str"));
            dataUsableVo.setControlRate(controlMap.get("rate"));


            voList.add(dataUsableVo);
        }

        if (collection instanceof Page) {
            Page<TBaseSurfMin> page = (Page<TBaseSurfMin>) collection;
            Page<DataUsableVo> voPage = new Page<>();
            BeanUtil.copyProperties(page, voPage);
            voPage.addAll(voList);
            voList = voPage;
        }

        return voList;
    }


    private Map<String, String> getDataByQCode(TBaseSurfMin surfMin,List<String> codeList,int sum){
        Map<String, String> map = new HashMap<>();
        int num = 0;
        List<String> dataStr = new ArrayList<>();

        // 气压质控码
        if(codeList.contains(surfMin.getQ1Prs())){
            num++;
            dataStr.add("气压:"+surfMin.getPrs());
        }
        // 温度质控码
        if(codeList.contains(surfMin.getQ1Tem())){
            num++;
            dataStr.add("温度:"+surfMin.getTem());
        }
        // 瞬时风速质控码
        if(codeList.contains(surfMin.getQ1WinSInst())){
            num++;
            dataStr.add("风速:"+surfMin.getWinSInst());
        }
        // 瞬时风向质控码
        if(codeList.contains(surfMin.getQ1WinDInst())){
            num++;
            dataStr.add("风向:"+surfMin.getWinDInst());
        }
        // 湿度质控码
        if(codeList.contains(surfMin.getQ1Rhu())){
            num++;
            dataStr.add("湿度:"+surfMin.getRhu());
        }
        // 雨量质控码
        if(codeList.contains(surfMin.getQ1Pre())){
            num++;
            dataStr.add("雨量:"+surfMin.getPre());
        }

        // 个数
        map.put("num",num+"");
        // 多个数据以逗号隔开
        map.put("str",String.join(",", dataStr));
        // 率 目前默认是除以 除开无观测任务的数据
        map.put("rate", MathUtils.except(num, sum, 2));

        return map;
    }

}
